redis 事务

Redis的事务

  基本每个成熟的数据库都有事务,redis也不例外。
  redis通过multi(开始事务),exec指事务的执行,discard表示事务的丢弃。
  multi开始后,后面的指令不是直接执行,而是缓存在服务器redis的事务队列中,而服务器一旦收到exec指令,才开始执行整个事务队列,执行完毕后统一返回结果,由于redis的单线程特性,故不用担心其被其他指令打扰。
  redis的事务没有原子性,中间的失败了,不仅不回滚,后面的反而继续执行。
  我们可以用discard指令来丢弃redis事务队列里面的数据。
  我们一般用pipeline来发送事务里面的指令一起发送,减少网络io次数。
  但是redis里面无法做乘除法则,有时候需要乘除,那该怎么办呢?也就是说一个事务里面无法完成所有的操作,我们必须通过2个甚至多个事务来完成,这样就会有并发问题,因为这个不是串行的,可能2个事务之间,会有别的事务插进来。于是有了watch机制。就是开启事务之前,先watch要修改的key,然后在事务修改,当修改遇见问题则会报错,是一个乐观锁。